home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / dviware / crudetype / version3 / w2c.lex < prev    next >
Text File  |  1991-11-28  |  5KB  |  174 lines

  1. %{
  2. #include "w2c.h"
  3. #include "w2cy.h"
  4. #ifdef    ANSI
  5. int yylex(void);
  6. #ifndef    BSD
  7. static void unput(char);
  8. static int input(void);
  9. #endif
  10. #endif
  11. char conditional[20], negbuf[2], temp[20];
  12. extern boolean doing_statements;
  13. %}
  14. DIGIT        [0-9]
  15. ALPHA        [a-zA-Z]
  16. ALPHANUM    ({DIGIT}|{ALPHA})
  17. IDENTIFIER    ({ALPHA}{ALPHANUM}*)
  18. NUMBER        ({DIGIT}+)
  19. SIGN        ("+"|"-")
  20. SIGNED        ({SIGN}?{NUMBER})
  21. WHITE        [ \n\t]+
  22. REAL        ({NUMBER}"."{NUMBER}("e"{SIGNED})?)|({NUMBER}"e"{SIGNED})
  23. COMMENT        (("{"[^}]*"}")|("(*"([^*]|"*"[^)])*"*)"))
  24. W        ({WHITE}|"packed")+
  25. WW        ({WHITE}|{COMMENT}|"packed")*
  26. HHB0        ("hh"{WW}"."{WW}"b0")
  27. HHB1        ("hh"{WW}"."{WW}"b1")
  28.  
  29. %%
  30. {W}                ;
  31. "{"                {while (input() != '}');
  32.                 }
  33. "#"                {
  34.                     register int c;
  35.                     (void) putc('#', std);
  36.                     while ((c = input()) && c != ';')
  37.                     (void) putc(c, std);
  38.                     (void) putc('\n', std);
  39.                 }
  40. "ifdef("            {register int c;
  41.                  register char *cp=conditional;
  42.                  new_line();
  43.                  (void) input();
  44.                  while ((c = input()) != '\'')
  45. #ifdef    MS_DOS
  46.                     *cp++ = (char) c;
  47. #else
  48.                     *cp++ = c;
  49. #endif
  50.                  *cp = '\0';
  51.                  (void) input();
  52.                  if (doing_statements) fputs("\t;\n", std);
  53.                  (void) fprintf(std,
  54.                     "#ifdef %s\n", conditional);
  55.                 }
  56. "endif("            {register int c;
  57.                  new_line();
  58.                  fputs("#endif /* ", std);
  59.                  (void) input();
  60.                  while ((c = input()) != '\'')
  61.                     (void) putc(c, std);
  62.                  (void) input();
  63.                  conditional[0] = '\0';
  64.                  fputs(" */\n", std);
  65.                 }
  66. "forward"            return(last_tok=forward_tok) ;
  67. "external"            return(last_tok=extern_tok) ;
  68. "@define"            return(last_tok=define_tok);
  69. "@field"            return(last_tok=field_tok);
  70. "and"                return(last_tok=and_tok) ;
  71. "array"                return(last_tok=array_tok) ;
  72. "begin"                return(last_tok=begin_tok) ;
  73. "case"                return(last_tok=case_tok) ;
  74. "const"                return(last_tok=const_tok) ;
  75. "div"                return(last_tok=div_tok) ;
  76. "break"                return(last_tok=break_tok);
  77. "do"                return(last_tok=do_tok) ;
  78. "downto"            return(last_tok=downto_tok) ;
  79. "else"                return(last_tok=else_tok) ;
  80. "end"                return(last_tok=end_tok) ;
  81. "file"                return(last_tok=file_tok) ;
  82. "for"                return(last_tok=for_tok) ;
  83. "function"            return(last_tok=function_tok) ;
  84. "goto"                return(last_tok=goto_tok) ;
  85. "if"                return(last_tok=if_tok) ;
  86. "label"                return(last_tok=label_tok) ;
  87. "mod"                return(last_tok=mod_tok) ;
  88. "not"                return(last_tok=not_tok) ;
  89. "of"                return(last_tok=of_tok) ;
  90. "or"                return(last_tok=or_tok) ;
  91. "procedure"            return(last_tok=procedure_tok) ;
  92. "program"            return(last_tok=program_tok) ;
  93. "record"            return(last_tok=record_tok) ;
  94. "repeat"            return(last_tok=repeat_tok) ;
  95. {HHB0}                return(last_tok=hhb0_tok) ;
  96. {HHB1}                return(last_tok=hhb1_tok) ;
  97. "then"                return(last_tok=then_tok) ;
  98. "to"                return(last_tok=to_tok) ;
  99. "type"                return(last_tok=type_tok) ;
  100. "until"                return(last_tok=until_tok) ;
  101. "var"                return(last_tok=var_tok) ;
  102. "with"                return(last_tok=with_tok) ;
  103. "new"                return(last_tok=new_tok) ;
  104. "while"                return(last_tok=while_tok) ;
  105. "others"            return(last_tok=others_tok) ;
  106. "write"                return(last_tok=write_tok) ;
  107. "writeln"            return(last_tok=writeln_tok) ;
  108. {REAL}                {        
  109.                   (void) sprintf(temp, "%s%s", negbuf, yytext);
  110.                   negbuf[0] = '\0';
  111.                   return(last_tok=r_num_tok) ;
  112.                 }
  113. {NUMBER}            {
  114.                   (void) sprintf(temp, "%s%s", negbuf, yytext);
  115.                   negbuf[0] = '\0';
  116.                   return(last_tok=i_num_tok) ;
  117.                 }
  118. ("'"([^']|"''")"'")        return(last_tok=single_char_tok) ;
  119. ("'"([^']|"''")*"'")        return(last_tok=string_literal_tok) ;
  120. "+"                { if ((last_tok>=undef_id_tok &&
  121.                       last_tok<=field_id_tok) ||
  122.                       last_tok==i_num_tok ||
  123.                       last_tok==r_num_tok ||
  124.                       last_tok==')' ||
  125.                       last_tok==']')
  126.                    return(last_tok='+') ;
  127.                 else return(last_tok=unary_plus_tok) ; }
  128. "-"                { if ((last_tok>=undef_id_tok &&
  129.                       last_tok<=field_id_tok) ||
  130.                       last_tok==i_num_tok ||
  131.                       last_tok==r_num_tok ||
  132.                       last_tok==')' ||
  133.                       last_tok==']')
  134.                    return(last_tok='-') ;
  135.                 else {
  136.                   int c;
  137.                   while ((c = input()) == ' ' || c == '\t');
  138. #ifdef    MS_DOS
  139.                   unput((char) c);
  140. #else
  141.                   unput(c);
  142. #endif
  143.                   if (c < '0' || c > '9') {
  144.                     return(last_tok = unary_minus_tok);
  145.                   }
  146.                   negbuf[0] = '-';
  147.                 }}
  148. "*"                return(last_tok='*') ;
  149. "/"                return(last_tok='/') ;
  150. "="                return(last_tok='=') ;
  151. "<>"                return(last_tok=not_eq_tok) ;
  152. "<"                return(last_tok='<') ;
  153. ">"                return(last_tok='>') ;
  154. "<="                return(last_tok=less_eq_tok) ;
  155. ">="                return(last_tok=great_eq_tok) ;
  156. "("                return(last_tok='(') ;
  157. ")"                return(last_tok=')') ;
  158. "["                return(last_tok='[') ;
  159. "]"                return(last_tok=']') ;
  160. ":="                return(last_tok=assign_tok) ;
  161. ".."                return(last_tok=two_dots_tok) ;
  162. "."                return(last_tok='.') ;
  163. ","                return(last_tok=',') ;
  164. ";"                return(last_tok=';') ;
  165. ":"                return(last_tok=':') ;
  166. "^"                return(last_tok='^') ;
  167. {IDENTIFIER}            { (void) strcpy(last_id,yytext) ; 
  168.                   l_s=search_table(last_id) ;
  169.                   if (l_s) return(last_tok=sym_table[l_s].typ);
  170.                                     else return(last_tok=undef_id_tok);
  171.                 }
  172. .                return(last_tok=unknown_tok) ;
  173. %%
  174.